<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>pg_resetxlog</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="app-pg-ctl.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="app-pg-ctl.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="app-postgres.html">快进</a></td><td width="10%" align="right" valign="top"><a href="app-postgres.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="APP-PGRESETXLOG"></a><span class="APPLICATION">pg_resetxlog</span></h1>
<div class="REFNAMEDIV"><a name="AEN60791"></a><h2>名称</h2>pg_resetxlog&nbsp;--&nbsp;重置一个数据库集群的预写日志以及其它控制内容</div>
<div class="REFSYNOPSISDIV"><a name="AEN60795"></a><h2>语法</h2>
<p><tt class="COMMAND">pg_resetxlog</tt> [-f] [-n] [-o<tt class="REPLACEABLE"><i>oid</i></tt> ] [-x <tt class="REPLACEABLE"><i>xid</i></tt> ] [-e <tt class="REPLACEABLE"><i>xid_epoch</i></tt> ] [-m <tt class="REPLACEABLE"><i>mxid</i></tt> ] [-O <tt class="REPLACEABLE"><i>mxoff</i></tt> ] [-l <tt class="REPLACEABLE"><i>timelineid</i></tt>, <tt class="REPLACEABLE"><i>fileid</i></tt>, <tt class="REPLACEABLE"><i>seg</i></tt> ]  <tt class="REPLACEABLE"><i>datadir</i></tt></p>
</div>
<div class="REFSECT1"><a name="R1-APP-PGRESETXLOG-1"></a><h2>描述</h2>
<p><tt class="COMMAND">pg_resetxlog</tt> 清理预写日志(WAL)并且可以有选择地重置其它一些存储在 <tt class="FILENAME">pg_control</tt> 文件中的控制信息。有时候，如果这些文件崩溃了，就需要这个功能。一定只把它用作最后的方法，就是说只有因为这样的崩溃导致服务器无法启动的时候才使用。</p>
<p>运行这个命令之后，可能就可以启动服务器了，但是，一定要记住数据库可能因为部分提交的事务而含有不完整的数据。你应该马上转储数据，运行 <tt class="COMMAND">initdb</tt> ，然后重新加载。在重新加载之后，检查不完整的部分然后根据需要进行修复。</p>
<p>这个命令只能由安装服务器的用户运行，因为它需要对数据目录的读写权限。出于安全考虑，<tt class="COMMAND">pg_resetxlog</tt> 不使用环境变量 <tt class="ENVAR">PGDATA</tt> ，你必须在命令行上声明数据目录。</p>
<p>如果 <tt class="COMMAND">pg_resetxlog</tt> 抱怨说它无法判断用于 <tt class="FILENAME">pg_control</tt> 的有效数据，那么你可以强制它继续处理，方法是声明 <tt class="LITERAL">-f</tt>(强制)开关。在这种情况下，那些丢失了的数据将用模糊的近似数值代替。大多数字段都可以匹配上，但是下一个 OID 、下一个事务 ID 、下一个事务 ID 的 epoch(时间点)、下一个多事务 ID(两阶段提交的东西)、下一个多事务偏移量、WAL 开始地址、数据库区域字段可能需要手工帮助，前面六个可以用下面讨论的开关设置。<tt class="COMMAND">pg_resetxlog</tt> 自己的环境是猜测区域字段的来源；看看 <tt class="ENVAR">LANG</tt> 等东西，它们应该和 <tt class="COMMAND">initdb</tt> 运行的环境相匹配。如果你不能判断所有这些字段的正确数值，那么 <tt class="LITERAL">-f</tt> 仍然可以使用，但是这样恢复过来的数据库正确性更值得怀疑：立即转储和重新加载是必须的。在转储之前<span class="emphasis"><i class="EMPHASIS">不要</i></span>执行任何修改数据的操作，因为任何这样的动作都可能把事情搞得更糟糕。</p>
<p><tt class="LITERAL">-o</tt>, <tt class="LITERAL">-x</tt>, <tt class="LITERAL">-e</tt>, <tt class="LITERAL">-m</tt>, <tt class="LITERAL">-O</tt>, <tt class="LITERAL">-l</tt> 开关允许手工设置下一个 OID 、下一个事务 ID 、下一个事务 ID epoch 、下一个多事务 ID 、下一个多事务偏移量、WAL 起始位置的数值。只有在 <tt class="COMMAND">pg_resetxlog</tt> 无法通过读取 <tt class="FILENAME">pg_control</tt> 判断合适的数值的时候才需要它。安全的数值可以用下面的方法判断：</p>
<ul>
<li><p>对于下一个事务 ID(<tt class="LITERAL">-x</tt>)而言，一个安全的数值是看看数据目录里的 <tt class="FILENAME">pg_clog</tt> 里数值最大的文件名，然后加一，然后再乘上 1048576 。请注意那些文件名是十六进制的。通常也以十六进制的形式声明开关值是最简单的。比如，如果 <tt class="FILENAME">0011</tt> 是 <tt class="FILENAME">pg_clog</tt> 里最大的记录，<tt class="LITERAL">-x 0x1200000</tt> 就可以了(后面的五个零提供了合适的乘积)。</p></li>
<li><p>下一个多事务 ID(<tt class="LITERAL">-m</tt>)的安全值可以通过查看数据目录里 <tt class="FILENAME">pg_multixact/offsets</tt> 子目录里面的数字最大的文件名，加一，然后乘以 65536 得到。和上面一样，文件名是十六进制的，因此最简单的方法是给开关声明一个十六进制的开关值，然后在结尾加四个零。</p></li>
<li><p>下一个多事务偏移量(<tt class="LITERAL">-O</tt>)的安全值可以通过检查数据目录里 <tt class="FILENAME">pg_multixact/members</tt> 子目录下的数字最大的文件名，加一，然后乘以 65536 得到。和上面一样，文件名是十六进制的，因此最简单的方法是给开关声明一个十六进制的开关值，然后在结尾加四个零。</p></li>
<li><p>WAL 的起始位置(<tt class="LITERAL">-l</tt>)应该比目前存在于数据目录 <tt class="FILENAME">pg_xlog</tt> 里面的任何文件号都大。它的文件名也是十六进制的，并且有三部分。第一部分是"时间线 ID"，通常应该保持相同。第三部分不要选择大于 255(<tt class="LITERAL">0xFF</tt>)；应该是在达到 255 的时候给第二部分增一然后重置第三部分为 0 。比如，如果 <tt class="FILENAME">00000001000000320000004A</tt> 是 <tt class="FILENAME">pg_xlog</tt> 里最大的条目，那么 <tt class="LITERAL">-l 0x1,0x32,0x4B</tt> 就可以了；但如果最大的条目是 <tt class="FILENAME">000000010000003A000000FF</tt> ，那么选择 <tt class="LITERAL">-l 0x1,0x3B,0x0</tt> 或更多。</p></li>
<li><p>没有很容易的办法来判断比数据库中最大的 OID 大一号的下一个 OID ，不过很走运的是获取正确的下一个 OID 并非非常关键的事情。</p></li>
<li><p>除了由 <tt class="COMMAND">pg_resetxlog</tt> 设定的字段外，事务 ID epoch 实际上并未存储在数据库里的任何地方。所以只要是涉及到数据库自身的任何数值都有效。你可能需要调整这个值以确保诸如 <span class="APPLICATION">Slony-I</span> 之类的备份系统能够正常工作。如果是这样的话，应当从下游已复制的数据库中获取恰当的值。</p></li>
</ul>
<p><tt class="LITERAL">-n</tt>(无操作)开关指示 <tt class="COMMAND">pg_resetxlog</tt> 打印从 <tt class="FILENAME">pg_control</tt> 重新构造的数值然后不修改任何值就退出。这主要是一个调试工具，但是在 <tt class="COMMAND">pg_resetxlog</tt> 真正处理前进行的整洁性检查的时候可能会有用。</p>
</div>
<div class="REFSECT1"><a name="AEN60882"></a><h2>注意</h2>
<p>在服务器运行的时候一定不要运行这个命令。如果发现在数据文件目录里有锁文件，那么 <tt class="COMMAND">pg_resetxlog</tt> 将拒绝启动。如果服务器崩溃，那么可能会剩下一个锁文件；如果这样，你可以删除该锁文件以便允许 <tt class="COMMAND">pg_resetxlog</tt> 运行。但是在你这么做之前，一定要确保没有任何后端服务器进程仍在运行。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="app-pg-ctl.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="app-postgres.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top"><span class="APPLICATION">pg_ctl</span></td><td width="34%" align="center" valign="top"><a href="reference-server.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top"><span class="APPLICATION">postgres</span></td></tr>
</table>
</div>
</body></html>